/*Copyright (C) 2009 - 2011 MASSART GAUTHIER

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "../headers.h"

#define TAILLE_MAX 1000

void vider_tableau_bantumi(short pot[13], short *suplements, short min, short max, char value);
short choisir_case_bantumi(short pot[13], short position, const char *joueur);

short ban_nombre_cailloux = 3, ban_couleur_cailloux = COLOR_RED, ban_couleur_fond = COLOR_CYAN, ban_couleur_tableau = COLOR_WHITE, ban_couleur_selecteur = COLOR_YELLOW;

void vider_tableau_bantumi(short pot[13], short *suplements, short min, short max, char value) {
	short i = 0;

	while(i <= max - min) {
		*suplements += pot[min + i];
		pot[min + i] = value;
		i++;
	}
}

short choisir_case_bantumi(short pot[13], short position, const char *joueur) {
	short choix = 0, save_choix = 0, max = 0, min = 0, l = '0';

	if(position == 2)  {
		choix = 1;
		max = 6;
		min = 1;
	}
	else if(position == 1) {
		choix = 13;
		max = 13;
		min = 8;
	}

	while(l != '\r' && l != '\n' && l != '\b') {
		ban_affichage_pot(pot, "", "Veuillez sélectionner le pot dont vous voulez déplacer les cailloux.", joueur, choix, position);
		l = getch();

		if(choix == 0 && l != KEY_RETURN) {
			choix = save_choix;
		}

		if(l == touche_gauche) {
			if(position == 2) {
				if(choix > min) {
					choix--;
				}
			}
			else if(position == 1) {
				if(choix < max) {
					choix++;
				}
			}
		}

		if(l == touche_droite) {
			if(position == 1) {
				if(choix > min) {
					choix--;
				}
			}
			else if(position == 2) {
				if(choix < max) {
					choix++;
				}
			}
		}

		if(l == '0') {
			save_choix = choix;
			choix = 0;
		}
	}

	return choix;
}

void ban_jeu(bool IA) {
	char *contenu_titre = "BANTUMI", prenom_2[100];
	short pot[14] = { 0, ban_nombre_cailloux, ban_nombre_cailloux, ban_nombre_cailloux, ban_nombre_cailloux, ban_nombre_cailloux, ban_nombre_cailloux, 0, ban_nombre_cailloux, ban_nombre_cailloux, ban_nombre_cailloux, ban_nombre_cailloux, ban_nombre_cailloux, ban_nombre_cailloux}, quitter = 1, choix = 0, suplements = 0, contenu_pot = 0, decalage_pot = 0, pot_en_face = 0, i;
	bool rejouer_J1, rejouer_J2;

	clear();
	afficher_titre(contenu_titre);
	get_player_name(0, prenom);
	if(!IA) {
		get_player_name(2, prenom_2);
	}
	else {
		strcpy(prenom_2, "L'ordinateur");
	}
	clear();
	afficher_titre(contenu_titre);

	while((pot[1] != 0 || pot[2] != 0 || pot[3] != 0 || pot[4] != 0 || pot[5] != 0 || pot[6] != 0 || pot[8] != 0 || pot[9] != 0 || pot[10] != 0 || pot[11] != 0 || pot[12] != 0 || pot[13] != 0) && quitter != 0) {
		rejouer_J1 = true, rejouer_J2 = true;

		if(pot[1] == 0 && pot[2] == 0 && pot[3] == 0 && pot[4] == 0 && pot[5] == 0 && pot[6] == 0) { // Si un le joueur 1 a 0 dans tous ses pots
			vider_tableau_bantumi(pot, &suplements, 8, 13, 0); // Tous les points restant vont au joueur 2
			pot[0] += suplements;
			rejouer_J1 = false;
			rejouer_J2 = false;
		}

		while(rejouer_J1) {
			choix = choisir_case_bantumi(pot, 2, prenom);

			if(choix != 0) {
				rejouer_J1 = false;
				if(pot[choix] == 0) {
					rejouer_J1 = true;
					ban_affichage_pot(pot, "Il faut un caillou au minimum !", "", prenom, choix, 0);
					afficher_temps(39, 'm', 1, 1500);
					ban_affichage_pot(pot, "Veuillez rejouer !", "", prenom, choix, 0);
					afficher_temps(39, 'm', 1, 1000);
				}
				else {
					contenu_pot = pot[choix];
					pot[choix] = 0;
					decalage_pot = 1;

					for(i = 1; contenu_pot >= i; i++) {
						pot[choix + decalage_pot]++;

						if(choix + decalage_pot == 13) {
							decalage_pot = -1 * choix;
						}

						CSLP_Sleep(250);

						ban_affichage_pot(pot, "", "", prenom, choix, 0);
						decalage_pot++;
					}

					if(choix + decalage_pot - 1 == 7) {
						if(pot[1] == 0 && pot[2] == 0 && pot[3] == 0 && pot[4] == 0 && pot[5] == 0 && pot[6] == 0) {
							vider_tableau_bantumi(pot, &suplements, 8, 13, 0);
							pot[0] += suplements;
							rejouer_J1 = false;
							rejouer_J2 = false;
						}
						else {
							rejouer_J1 = true;
							ban_affichage_pot(pot, "Veuillez rejouer !", "", prenom, choix, 0);
							afficher_temps(39, 'm', 1, 1000);
						}
					}
					else if(pot[choix + decalage_pot - 1] == 1 && (choix + decalage_pot - 1) < 7) {

						CSLP_Sleep(500);
						pot[choix + decalage_pot - 1] = 0;
						ban_affichage_pot(pot, "", "", prenom, choix, 0);
						CSLP_Sleep(500);

						switch(choix + decalage_pot - 1) {
						case 1 :
							pot_en_face = 12;
							break;
						case 2 :
							pot_en_face = 10;
							break;
						case 3 :
							pot_en_face = 8;
							break;
						case 4 :
							pot_en_face = 6;
							break;
						case 5 :
							pot_en_face = 4;
							break;
						case 6 :
							pot_en_face = 2;
							break;
						default :
							break;
						}

						if(pot[choix + decalage_pot - 1 + pot_en_face] != 0) {
							suplements = pot[choix + decalage_pot - 1 + pot_en_face];
							pot[choix + decalage_pot - 1 + pot_en_face] = 0;
							ban_affichage_pot(pot, "", "", prenom, choix, 0);
							CSLP_Sleep(500);
							pot[7] += suplements + 1;
						}
						else {
							pot[7]++;
						}

						ban_affichage_pot(pot, "", "", prenom, choix, 0);
					}
				}
			}
			else {
				clear();
				choix = afficher_menu("Oui\nNon\n", "Voulez-vous quitter la partie en cours ?\n", contenu_titre);

				CSLP_ColorText(CT);

				if(choix == 1) {
					quitter = 0;
					rejouer_J1 = false;
					rejouer_J2 = false;
				}
				else {
					clear();
					afficher_titre(contenu_titre);
				}
			}
		}

		if(pot[8] == 0 && pot[9] == 0 && pot[10] == 0 && pot[11] == 0 && pot[12] == 0 && pot[13] == 0) {
			suplements = pot[1] + pot[2] +  pot[3] + pot[4] + pot[5] + pot[6];
			vider_tableau_bantumi(pot, &suplements, 1, 6, 0);
			pot[7] += suplements;
			rejouer_J2 = false;
		}

		while(rejouer_J2) {
			if(!IA) {
				choix = choisir_case_bantumi(pot, 1, prenom_2);
			}
			else {
				ban_affichage_pot(pot, "Veuillez patienter.", "sélectionne une case...", prenom_2, choix, 0);
				choix = ban_IA(pot);
			}

			if(choix != 0) {
				rejouer_J2 = false;

				if(pot[choix] == 0) {
					rejouer_J2 = true;
					ban_affichage_pot(pot, "Il faut un caillou au minimum !", "", prenom_2, choix, 0);
					afficher_temps(39, 'm', 1, 1500);
					ban_affichage_pot(pot, "Veuillez rejouer !", "", prenom_2, choix, 0);
					afficher_temps(39, 'm', 1, 1000);
				}
				else {
					contenu_pot = pot[choix];
					pot[choix] = 0;
					decalage_pot = 1;

					for(i = 1; contenu_pot >= i; i++) {

						if(choix + decalage_pot == 14) {
							decalage_pot = -13;
						}

						pot[choix + decalage_pot]++;

						if(choix + decalage_pot == 13) {
							decalage_pot = -1 * choix - 1;
						}

						if(choix + decalage_pot == 6) {
							decalage_pot++;
						}

						CSLP_Sleep(250);

						ban_affichage_pot(pot, "", "", prenom_2, choix, 0);
						decalage_pot++;
					}

					if(choix + decalage_pot - 1 == -1) { //Si la dernière case est la 13, cela pose un petit problème, donc on réaligne à 13
						decalage_pot = 14 + decalage_pot;
					}

					if(choix + decalage_pot - 1 == 0) {
						if(pot[8] == 0 && pot[9] == 0 && pot[10] == 0 && pot[11] == 0 && pot[12] == 0 && pot[13] == 0) {
							suplements = pot[1] + pot[2] +  pot[3] + pot[4] + pot[5] + pot[6];
							vider_tableau_bantumi(pot, &suplements, 1, 6, 0);
							pot[7] += suplements;
							rejouer_J2 = false;
						}
						else {
							rejouer_J2 = true;
							if(!IA) {
								ban_affichage_pot(pot, "Veuillez rejouer !", "", prenom_2, choix, 0);
								afficher_temps(39, 'm', 1, 1000);
							}
							else {
								ban_affichage_pot(pot, "L'ordinateur rejoue !", "", prenom_2, choix, 0);
								afficher_temps(39, 'm', 1, 1000);
							}
						}
					}
					else if(pot[choix+decalage_pot-1] == 1 && (choix + decalage_pot - 1) > 7) {
						long suplements = 0, pot_en_face = 0;

						CSLP_Sleep(500);
						pot[choix+decalage_pot-1] = 0;
						ban_affichage_pot(pot, "", "", prenom_2, choix, 0);
						CSLP_Sleep(500);

						switch(choix + decalage_pot - 1) {
						case 8 :
							pot_en_face = -2;
							break;
						case 9 :
							pot_en_face = -4;
							break;
						case 10 :
							pot_en_face = -6;
							break;
						case 11 :
							pot_en_face = -8;
							break;
						case 12 :
							pot_en_face = -10;
							break;
						case 13 :
							pot_en_face = -12;
							break;
						default :
							break;
						}

						if(pot[choix+decalage_pot-1+pot_en_face] != 0) {
							suplements = pot[choix+decalage_pot-1+pot_en_face];
							pot[choix+decalage_pot-1+pot_en_face] = 0;
							ban_affichage_pot(pot, "", "", prenom_2, choix, 0);
							CSLP_Sleep(500);
						}

						pot[0] += suplements + 1;
						ban_affichage_pot(pot, "", "", prenom_2, choix, 0);
					}
				}
			}
			else {
				clear();
				choix = afficher_menu("Oui\nNon\n", "Voulez-vous quitter la partie en cours ?\n", contenu_titre);
				CSLP_ColorText(CT);

				if(choix == 1) {
					quitter = 0;
					rejouer_J2 = false;
				}
				else {
					clear();
					afficher_titre(contenu_titre);
				}
			}
		}
	}

	if(quitter != 0) {
		clear();
		afficher_titre(contenu_titre);

		if(pot[7] > pot[0]) {
			ban_affichage_pot(pot, "BRAVO →", "Vous avez gagné !", prenom, 0, 0);
		}
		else if(pot[7] < pot[0]) {
			ban_affichage_pot(pot, "← BRAVO", "Vous avez gagné !", prenom_2, 0, 0);
		}
		else {
			ban_affichage_pot(pot, "EGALITE", "Match nul !", "", 0, 0);
		}
		getchar();
	}

}
